package org.khd.gift.service.impl;

import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.khd.gift.domain.TenantType;
import org.khd.gift.mapper.TenantTypeMapper;
import org.khd.gift.service.ITenantTypeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author Saber
 * @since 2024-07-23
 */
@Service
public class TenantTypeServiceImpl extends ServiceImpl<TenantTypeMapper, TenantType> implements ITenantTypeService {

    /**
     * 加入缓存，使用redis
     * @param wrapper
     * @return
     */

    @Autowired
    private RedisTemplate redisTemplate;

    private static final String TENANT_TYPE_IN_REDIS = "tenant_type_in_redis";

    @Override
    public List<TenantType> selectList(Wrapper<TenantType> wrapper) {
        //1 从缓存中查询是否有数据
        Object object = redisTemplate.opsForValue().get(TENANT_TYPE_IN_REDIS);
        //1.1 如果有，则返回前端
        if (Objects.nonNull(object)){
            return (List<TenantType>)object;
        }

        //2 如果没有，则去数据库中查询
        List<TenantType> tenantTypes = super.selectList(wrapper);
        //如果为空，给一个默认值，解决缓存穿透问题
        if (tenantTypes == null){
            tenantTypes = new ArrayList<>();
        }

        //2.1 将查询的结果放入缓存中，并返回前端
        redisTemplate.opsForValue().set(TENANT_TYPE_IN_REDIS, tenantTypes);

        return tenantTypes;
    }

    //3 因为当数据库中的数据发生改变，缓存中的值也要发生改变，所以我们要重写增删改操作
    /**
     * 有两种方式，一种是修改缓存中的数据，这种方式会产生很多不必要操作
     * 一种是删除缓存中的数据（选择这种）
     */

    @Override
    public boolean insertOrUpdate(TenantType entity) {
        boolean flag = super.insertOrUpdate(entity);
        redisTemplate.delete(TENANT_TYPE_IN_REDIS);
        return flag;
    }

    @Override
    public boolean delete(Wrapper<TenantType> wrapper) {
        boolean flag = super.delete(wrapper);
        redisTemplate.delete(TENANT_TYPE_IN_REDIS);
        return flag;
    }
}
